#pragma once
#include"sem.hpp"
#include<vector>
class RingQueue{
    public:
RingQueue(int cap)
:_cap(cap),
_blank_sem(cap),
_p_step(0),
_data_sem(0),
_c_step(0)
{
    _rq.resize(_cap);
}

void Queue(int &in)
{
    //生产数据
    //先申请信号量
    _blank_sem.P();
    _rq[_p_step++]=in;
    _p_step%=_cap;
    _data_sem.V();



}

// void Pop(int *out)
// {
// _data_sem.P();
// *out=_rq[_c_step++];
// _c_step%=_cap;
// _blank_sem.V();
    // *out = _rq[_c_step];
    //         // 3. 更新下标
    //         ++_c_step;
    //         // 4. 维持环形特性
    //         _c_step %= _cap;



    void Pop(int *out)  // 使用指针
{
    _data_sem.P();
    *out = _rq[_c_step];  // 解引用指针
    _c_step = (_c_step + 1) % _cap;
    _blank_sem.V();
}

//}

~RingQueue(){}




private:
std::vector<int> _rq;
int _cap;//总容量
//生产者
Sem _blank_sem;//空位置
int _p_step;//生产者所在位置
//消费者
Sem _data_sem;
int _c_step;
};